package effectiveJava;

import java.util.*;

/**
 * Created by dycong on 2017/8/21.
 *todo 带有计数功能的 Set ,P73
 *todo 通过组合/包装的方式，拓展了set的功能，ForwardingSet使用了具体 Set 的实现类的方法API，并且不依赖其具体的实现细节，即使在新的jdk版本，实现方式改变了也不影响ForwardingSet的功能；
 *todo 复合的同时实现了接口 Set ，保证了ForwardingSet的兼容发行，用路很广，因为 Set 接口包存了Set的功能特性，除了获得健壮性之外，这种设计也带来了格外的灵活性。
 *todo 通过“复合的方式拓展现有类的功能”
 */
public class InstrumentedSet<E> extends ForwardingSet<E> {
    private int count = 0;

    public InstrumentedSet(Set<E> s) {
        super(s);
    }

    @Override
    public boolean add(E e) {
        count++;
        return super.add(e);
    }

    @Override
    public boolean addAll(Collection<? extends E> c) {
        count += c.size();
        return super.addAll(c);
    }

    public int getCount() {
        return count;
    }
}
